home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #4 / Amiga Plus CD - 2000 - No. 4.iso / Tools / Dev / SpeakFreely_Src / gsm / src / preprocess.c < prev    next >
C/C++ Source or Header  |  2000-05-27  |  3KB  |  114 lines

  1. /*
  2.  * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
  3.  * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
  4.  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  5.  */
  6.  
  7. /* $Header: /home/kbs/jutta/src/gsm/gsm-1.0/src/RCS/preprocess.c,v 1.1 1992/10/28 00:15:50 jutta Exp $ */
  8.  
  9. #include    <stdio.h>
  10. #include    <assert.h>
  11.  
  12. #include "private.h"
  13.  
  14. #include    "gsm.h"
  15. #include     "proto.h"
  16.  
  17. /*    4.2.0 .. 4.2.3    PREPROCESSING SECTION
  18.  *  
  19.  *      After A-law to linear conversion (or directly from the
  20.  *       Ato D converter) the following scaling is assumed for
  21.  *     input to the RPE-LTP algorithm:
  22.  *
  23.  *      in:  0.1.....................12
  24.  *         S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.*
  25.  *
  26.  *    Where S is the sign bit, v a valid bit, and * a "don't care" bit.
  27.  *     The original signal is called sop[..]
  28.  *
  29.  *      out:   0.1................... 12 
  30.  *         S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0
  31.  */
  32.  
  33.  
  34. void Gsm_Preprocess P3((S, s, so),
  35.     struct gsm_state * S,
  36.     word         * s,
  37.     word          * so )        /* [0..159]     IN/OUT    */
  38. {
  39.  
  40.     word       z1 = S->z1;
  41.     longword L_z2 = S->L_z2;
  42.     word        mp = S->mp;
  43.  
  44.     word            s1;
  45.     longword      L_s2;
  46.  
  47.     longword      L_temp;
  48.  
  49.     word        msp, lsp, temp;
  50.     word        SO;
  51.  
  52.     longword    ltmp;        /* for   ADD */
  53.     ulongword    utmp;        /* for L_ADD */
  54.  
  55.     register int        k = 160;
  56.  
  57.     while (k--) {
  58.  
  59.     /*  4.2.1   Downscaling of the input signal
  60.      */
  61.         SO = SASR( *s, 3 ) << 2;
  62.         s++;
  63.  
  64.         assert (SO >= -0x4000);    /* downscaled by     */
  65.         assert (SO <=  0x3FFC);    /* previous routine. */
  66.  
  67.  
  68.     /*  4.2.2   Offset compensation
  69.      * 
  70.      *  This part implements a high-pass filter and requires extended
  71.      *  arithmetic precision for the recursive part of this filter.
  72.      *  The input of this procedure is the array so[0...159] and the
  73.      *  output the array sof[ 0...159 ].
  74.      */
  75.         /*   Compute the non-recursive part
  76.          */
  77.  
  78.         s1 = SO - z1;            /* s1 = gsm_sub( *so, z1 ); */
  79.         z1 = SO;
  80.  
  81.         assert(s1 != MIN_WORD);
  82.  
  83.         /*   Compute the recursive part
  84.          */
  85.         L_s2 = s1;
  86.         L_s2 <<= 15;
  87.  
  88.         /*   Execution of a 31 bv 16 bits multiplication
  89.          */
  90.  
  91.         msp = SASR( L_z2, 15 );
  92.         lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */
  93.  
  94.         L_s2  += GSM_MULT_R( lsp, 32735 );
  95.         L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/
  96.         L_z2   = GSM_L_ADD( L_temp, L_s2 );
  97.  
  98.         /*    Compute sof[k] with rounding
  99.          */
  100.         L_temp = GSM_L_ADD( L_z2, 16384 );
  101.  
  102.     /*   4.2.3  Preemphasis
  103.      */
  104.  
  105.         msp   = GSM_MULT_R( mp, -28180 );
  106.         mp    = SASR( L_temp, 15 );
  107.         *so++ = GSM_ADD( mp, msp );
  108.     }
  109.  
  110.     S->z1   = z1;
  111.     S->L_z2 = L_z2;
  112.     S->mp   = mp;
  113. }
  114.